package com.hsoft.zhxy.common.system.service.impl;

import com.hsoft.zhxy.common.redis.RedisClient;
import com.hsoft.zhxy.common.system.mapper.SystemMapper;
import com.hsoft.zhxy.common.system.service.SystemService;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 系统级数据接口实现类
 */
@Log4j2
@Service
public class SystemServiceImpl implements SystemService {

    @Autowired
    SystemMapper systemMapper;

    @Autowired
    RedisClient redisClient;

    // 用户权限uri集合 缓存key前缀
    private final String yhqxKeyPre = "SystemService#AuthUriCollectionStr#";    // + yhid

    // 功能资源是否需要判断权限 缓存key前缀
    private final String sfpdqxStrKeyPre = "SystemService#UriSfpdqx#";          // + qxlj

    // 获取用户信息 缓存key前缀
    private final String yhxmKeyPre = "SystemService#UriYhxm#";          // + yhid

    // 获取全部权限路径 缓存key前缀
    private final String allQxljKeyPre = "SystemService#UriAllQxlj#";          //

    /**
     * 根据用户ID获取用户的“权限uri集合字符串”
     * @param yhid
     * @return
     */
    public String findQqljListString(String yhid){

        // 定义当前用户的“权限uri集合字符串”
        String authUriCollectionStr = null;

        // 定义当前用户的缓存key
        String redisKey = yhqxKeyPre + yhid;

        // 判断缓存中是否存在“权限uri集合字符串”，则直接获取缓存数据
        Boolean bool = redisClient.hasKey(redisKey);
        if(bool!=null && bool){
            authUriCollectionStr = redisClient.get(redisKey);
        }

        // 如果缓存中的“权限uri集合字符串”获取失败或为空
        if(StringUtils.isBlank(authUriCollectionStr)){
            List<String> list = systemMapper.findQqljList(yhid);
            authUriCollectionStr = list.toString();
            redisClient.set(redisKey, authUriCollectionStr);
        }

        return authUriCollectionStr;
    }

    /**
     * 根据目标资源uri判断该目标资源是否需要权限验证。返回值类型：0-不需要验证，1-需要验证，""-不受权限集管理
     * @param qxlj
     * @return
     */
    public String getSfpdqx(String qxlj){

        // 定义返回值 是否需要权限验证的状态位
        String sfpdqx = "";
        // 定义缓存key
        String redisKey = sfpdqxStrKeyPre + qxlj;
        // 定义程序执行的状态位
        Boolean bool = false;

        // 如果缓存中存在该状态
        bool = redisClient.hasKey(redisKey);
        if(bool!=null && bool){
            String zt = redisClient.get(redisKey);
            if(zt!=null){
                sfpdqx = zt;
            }else{
                bool = false;
            }
        }

        // 如果缓存中不存在该状态
        if(!bool){
            Integer zt = systemMapper.getSfpdqx(qxlj);
            if(zt==null){
                sfpdqx = "";
            }else{
                sfpdqx = String.valueOf(zt);
            }
            redisClient.set(redisKey, sfpdqx);
        }
        return sfpdqx;
    }

    /**
     * 获取用户信息
     * @param yhid
     * @return
     */
    public String getYhxx(String yhid){

        // 定义返回值 用户姓名
        String yhxm = "";
        // 定义缓存key
        String redisKey = yhxmKeyPre + yhid;
        // 定义程序执行的状态位
        Boolean bool = false;

        bool = redisClient.hasKey(redisKey);

        if(bool!=null && bool){
            yhxm = redisClient.get(redisKey);
            if(StringUtils.isBlank(yhxm)){
                bool = false;
            }
        }

        // 如果缓存中不存
        if(!bool){
           yhxm = systemMapper.getYhxx(yhid);
            if(StringUtils.isBlank(yhxm)){
                yhxm = "";
            }
           redisClient.set(redisKey,yhxm);
        }

        return yhxm;
    }

    /**
     * 获取系统内全部的资源信息集合
     * @return
     */
    @Override
    public List<String> findSysAllQxljList() {
        List<String> strList = new ArrayList<>();

        // 定义缓存key
        String redisKey = allQxljKeyPre;
        // 定义程序执行的状态位
        Boolean bool = false;

        // 如果缓存中存在该状态
        bool = redisClient.hasKey(redisKey);

        if(bool!=null && bool){

            strList = redisClient.getList(redisKey);

        }

        if(null == strList || strList.size() ==0){

            strList = systemMapper.findQqljListGnzy();

            redisClient.setList(redisKey,strList);

        }

        return strList;
    }

}
